package com.rw.tool.util.io.file.serialize;

import com.rw.tool.util.io.file.exception.GetPropDBException;
import com.rw.tool.util.io.file.exception.SetPropDBException;
import com.rw.tool.util.io.file.property.PropertyVisitor;

import java.lang.reflect.Field;

/**
 * 属性访问器
 * 使用Field来进行属性访问
 *
 * @param <T> javabean的类型
 */
public class FieldPropertyVisitor<T> implements PropertyVisitor<T> {
    private final Field field;

    /**
     * 声明属性访问器
     *
     * @param field 属性
     */
    public FieldPropertyVisitor(Field field) {
        this.field = field;
    }

    /**
     * 获取属性值
     *
     * @param bean 对象
     * @return 属性值
     */
    @Override
    public Object get(T bean) {
        try {
            return field.get(bean);
        } catch (Exception e) {
            throw new GetPropDBException(e);
        }
    }

    /**
     * 设置属性值
     *
     * @param bean  对象
     * @param value 设置的属性值
     */
    @Override
    public void set(T bean, Object value) {
        try {
            field.set(bean, value);
        } catch (Exception e) {
            throw new SetPropDBException(e);
        }
    }
}